﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace Iudicium.Seguridad.CRN
{
    /// <summary>
    /// Summary description for PermisoCRN
    /// </summary>
    public class PermisoCRN
    {
        public PermisoCRN()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public static List<Permiso> GetPermisosByRol(int rolId)
        {

            if (rolId < 0)
            {
                throw new ArgumentException("El rolId no puede ser menor o igual a cero.");
            }

            List<Permiso> lista = new List<Permiso>();

            RolDSTableAdapters.PermisosTableAdapter adapter = new RolDSTableAdapters.PermisosTableAdapter();

            RolDS.PermisosDataTable tabla = adapter.GetPermisosByRol(rolId);
            if (tabla == null)
            {
                throw new Exception("El SQL se ejecuto correctamente, pero la consulta devolvio un conjunto de valores nulos.");
            }

            foreach (RolDS.PermisosRow row in tabla)
            {
                Permiso objPermiso = ConstruirPermiso(row, rolId);
                lista.Add(objPermiso);
            }

            return lista;
        }

        public static bool UsuarioTienePermiso(string permiso, int usuarioId)
        {
            if(string.IsNullOrEmpty(permiso))
            {
                throw new ArgumentException("El permiso no puede ser nulo o vacio.");
            }

            if (usuarioId <= 0)
            {
                throw new ArgumentException("El usuarioId no puede ser menor o igual que cero.");
            }

            bool? result = false;

            UsuarioDSTableAdapters.UsuarioTableAdapter adapter = new UsuarioDSTableAdapters.UsuarioTableAdapter();

            adapter.TienePermiso(usuarioId, permiso, ref result);

            if(result == null)
            {
                throw new Exception("El SQL se ejecuto correctamente pero el parametro de salida resulto nulo.");
            }

            return result.Value;
        }

        private static Permiso ConstruirPermiso(RolDS.PermisosRow row, int rolId)
        {
            return new Permiso(rolId, row.programaId, row.nombre, !row.IsrolIdNull());
        }
    }
}